package com.styytech.dadabao.utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;

import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.http.HttpHandler;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.loopj.android.http.RequestParams;
import com.styytech.dadabao.DadaApplication;
import com.styytech.dadabao.api.requestresult.CommonResult;
import com.styytech.dadabao.api.response.AbstractResponseResult;
import com.styytech.dadabao.api.templates.HttpRequest;
import com.styytech.dadabao.constant.ConstantsServerUrl;
import com.styytech.dadabao.exception.ArgumentsException;
import com.styytech.dadabao.exception.RequestException;
import com.styytech.dadabao.widge.dialog.DownloadDialog;
import com.styytech.dadabao.widge.dialog.EnsureDialog;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;

/**
 * Created by user on 2015/8/3.
 */
public class UpdateAppUtils {
    private String sdPath = "/sdcard/xUtils/" + System.currentTimeMillis()
            + "dadabao.apk";
    private HttpHandler handler;

    //定义布局过滤器
    private Context mContext;
//    private Activity mActivity;
    // Dialog dialog,mdialog;
    EnsureDialog ensureDialog;
    DownloadDialog downloadDialog;
    private String dowlondUrl;

    public UpdateAppUtils() {
        super();
    }

    public UpdateAppUtils(Context contex) {
        mContext = contex;
    }
    int updateMechanism = 0;
    /**
     * 检测应用升级
     */
    @SuppressLint("HandlerLeak")
    public void checkingVersion() {
        //版本检测
        String versionName = CommonUtils.getVersionName(mContext);
        String url = ConstantsServerUrl.getCheckVersionUrl();
        RequestParams params = new RequestParams();
        params.put("appType", 1);
        params.put("appName", "dadabaoApp");
        params.put("versionNo", versionName);
        params.put("businessAppType", 6);
        CommonResult logResult = new CommonResult(responseResult);
        try {
            new HttpRequest(mContext).doPost(logResult, url, params);
        } catch (ArgumentsException e) {
            Log.i("INFO", "1e:" + e);
            e.printStackTrace();
        } catch (RequestException e) {
            Log.i("INFO", "2e:" + e);
            e.printStackTrace();
        }

    }

    /**
     * 检测结果处理
     */
    AbstractResponseResult responseResult = new AbstractResponseResult() {

        @Override
        public void executeSuccess(Object object) {
            // TODO
            Log.i("INFO", "获取结果:" + object);
            JSONArray jsonArray = new JSONArray();
            jsonArray = (JSONArray) object;
            setVersion(jsonArray);
        }

        @Override
        public void executeError(String message, int errorCode) {
            // TODO Auto-generated method stub
            Log.i("INFO", "message:" + message);
        }

        @Override
        public void HttpError(String message, int errorCode) {
            // TODO Auto-generated method stub
            Log.i("INFO", "message:" + message);
        }
    };

    /**
     * 处理版本信息
     *
     * @param jsonArray
     */
    private void setVersion(JSONArray jsonArray) {
        JSONObject jsonObjectApp;
        String url = null;

        try {
            if (jsonArray.length() > 0) {

                jsonObjectApp = jsonArray.getJSONObject(0);
                Log.e("dasdas","jsonObjectApp-----------"+jsonObjectApp);
                url = jsonObjectApp.has("url") ? jsonObjectApp.getString("url")
                        : "";

                updateMechanism = jsonObjectApp.has("updateMechanism") ? jsonObjectApp
                        .getInt("updateMechanism") : 0;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        if (url != null) {
            url = ConstantsServerUrl.servers + url;
            updataApp(url);
        } /*else {
            starActivity();
        }*/

    }

    /**
     * 是否需要升级？
     */
    public void updataApp(final String url) {
        //第二个参数控制强制升级
        dowlondUrl = url;
        /**
         * 标准样式的确定取消dialog
         * 上下文对象、title、内容、第一个button的文字，第二个button的文字*/
        if (updateMechanism==1){
            ensureDialog = new EnsureDialog(mContext, "提示", "发现新版本，是否需要升级？", "确定", "退出");
            ensureDialog.setEnsureDialogCallback(ensureDialogcallback);
            ensureDialog.setCanceleDialogCallback(cancelDialogcallback);
            //如果强制升级(点其他位置或back不能取消)
            ensureDialog.NotCancel(false);
            ensureDialog.show();
        }else{
            ensureDialog = new EnsureDialog(mContext, "提示", "发现新版本，是否需要升级？", "确定", "取消");
            ensureDialog.setEnsureDialogCallback(ensureDialogcallback);
            ensureDialog.setCanceleDialogCallback(cancelDialogcallback);
            //如果强制升级(点其他位置或back不能取消)
            ensureDialog.NotCancel(true);
            ensureDialog.show();
        }

        /**
         * 标准样式但是只有一个按钮的dialog
         * 上下文对象、title、内容、设置为只有一个button传值1、第一个button的文字*/
        // ensureDialog = new EnsureDialog(mContext,"提示","发现新版本，是否需要升级？",1,"确定");
        /**
         * 没有title只有一个按钮的dialog
         * 上下文对象、内容、设置为只有一个button传值1、第一个button的文字*/
        // ensureDialog = new EnsureDialog(mContext,"发现新版本，是否需要升级？",1,"确定");
        /**
         * 没有title但是有两个按钮的dialog
         * 上下文对象、内容、第一个button的文字，第二个button的文字*/
        // ensureDialog = new EnsureDialog(mContext,"发现新版本，是否需要升级？","确定2","取消2");

    }

    /**
     * 设置mydialog需要处理的事情
     */
    EnsureDialog.Dialogcallback ensureDialogcallback = new EnsureDialog.Dialogcallback() {
        @Override
        public void dialogdo() {
            ensureDialog.dismiss();
            downloadApp(dowlondUrl);
        }
    };
    EnsureDialog.Dialogcallback cancelDialogcallback = new EnsureDialog.Dialogcallback() {
        @Override
        public void dialogdo() {
            if (updateMechanism==1){
                ensureDialog.dismiss();
                DadaApplication.exit();
            }else{
                ensureDialog.dismiss();
            }


        }
    };


    private void downloadApp(String url) {
        Log.i("INFO_________", "获取结果url:" + url);
        showDialog();
        String target = "/sdcard/dada/" + "dada.apk";
        File file = new File(target);
        if (!file.exists()) {
            file.mkdirs();
        }

        HttpUtils http = new HttpUtils();
        handler = http.download(url, sdPath, true, false,
                new RequestCallBack<File>() {
                    @SuppressWarnings("deprecation")
                    @Override
                    public void onStart() {
                    }

                    @Override
                    public void onLoading(long total, long current,
                                          boolean isUploading) {
                        super.onLoading(total, current, isUploading);
                        downloadDialog.setProgress((int) ((double) current
                                / (double) total * 100));
                        downloadDialog.setPercent((int) (current * 100 / total) + "%");

                    }

                    @Override
                    public void onSuccess(ResponseInfo<File> responseInfo) {
                        install(responseInfo.result.getPath());
                        downloadDialog.dismiss();
                        if (updateMechanism==1){
                            DadaApplication.exit();
                        }

                    }

                    @Override
                    public void onFailure(
                            com.lidroid.xutils.exception.HttpException error,
                            String msg) {
                        // TODO Auto-generated method stub
                        downloadDialog.dismiss();
                    }
                });
    }

    private void showDialog() {
        /**
         * 没有详细内容使用默认icon的dialog
         * 上下文对象、title*/
        downloadDialog = new DownloadDialog(mContext, "更新");
        /**
         * 没有详细内容不使用默认icon的dialog
         * 上下文对象、title drawable*/
        // downloadDialog=new DownloadDialog(mContext,"更新",mContext.getResources().getDrawable(R.drawable.icon_home));
        /**
         * 有详细内容使用默认icon的dialog
         * 上下文对象 title type为1时表示有详细内容 详细内容*/
        // downloadDialog=new DownloadDialog(mContext,"更新",1,"本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术");
        /**
         * 有详细内容不使用默认icon的dialog
         * 上下文对象 title drawable type为1时表示有详细内容 详细内容*/
        //  downloadDialog=new DownloadDialog(mContext,"更新",mContext.getResources().getDrawable(R.drawable.icon_home),1,"本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术本次更新使用了最新技术");

        //如果强制升级(点其他位置或back不能取消)
        if (updateMechanism==1){
            downloadDialog.NotCancel(false);
            downloadDialog.setProgress(0);
            downloadDialog.show();
        }else{
            downloadDialog.NotCancel(true);
            downloadDialog.setProgress(0);
            downloadDialog.show();
        }


    }

    public void install(String appSourceFile) {
        // 核心是下面几句代码
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(new File(appSourceFile)),
                "application/vnd.android.package-archive");
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        mContext.startActivity(intent);
    }
   /* private void setDialogWindow(Dialog tDialog,View v){
        tDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
        tDialog.setCanceledOnTouchOutside(false);//设置点击屏幕其他地方，dialog不消失
        tDialog.setCancelable(false);//设置点击返回键和HOme键，dialog不消失
        tDialog.setContentView(v);

        Window dialogWindow = tDialog.getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        dialogWindow.setGravity(Gravity.CENTER);
        WindowManager m = ((Activity)mContext).getWindowManager();
        Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用
        WindowManager.LayoutParams p = dialogWindow.getAttributes(); // 获取对话框当前的参数值
        p.height = (int) (d.getHeight() * 0.2); // 高度设置为屏幕的0.6
        p.width = (int) (d.getWidth() * 0.7); // 宽度设置为屏幕的0.65
        dialogWindow.setAttributes(lp);
        tDialog.show();
    }*/
}
